/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.seguridad.controlador;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.abstracts.ControladorEncaAbstract;
import sv.com.intesal.seguridad.bean.PerfilRoles;
import sv.com.intesal.seguridad.bean.Rol;
import sv.com.intesal.seguridad.bean.TipoPerfil;
import sv.com.intesal.seguridad.sql.SQLRol;
import sv.com.intesal.seguridad.sql.SQLTipoAccionFormulario;

/**
 *
 * @author ejerez
 */
public class PerfilRolesControlador extends ControladorEncaAbstract {

    public void insert() throws Exception {
        try {
            super.setEncaPreparedStatement(SQLRol.Perfil.insertPerfilRoles).executeUpdate();
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }

    public void update(PerfilRoles pr) throws Exception {
        try {
            List<Rol> rol = pr.getRol();
            for (int i = 0; i < rol.size(); i++) {
                super.setEncaPreparedStatement(SQLRol.Perfil.updatePerfilRoles);
                super.ps_enca.setString(1, v.getEstado_A_I(rol.get(i).getEstado_filtro_pr()));
                super.ps_enca.setInt(2, rol.get(i).getCodigo_pr());
                super.ps_enca.executeUpdate();
            }
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }

    public void updateEspecial(PerfilRoles pr) throws Exception {
        try {
            List<Rol> rol = pr.getRol();
            for (int i = 0; i < rol.size(); i++) {
                if (rol.get(7).getEstado_filtro_pr() == true) {
                    /*UPDATE ALL MODULOS*/

                    if (pr.getEstado_all_perfiles_pr() == true) {
                        /*UPDATE ALL PERFILES*/
                        super.setEncaPreparedStatement(SQLRol.Perfil.updatePerfilRoles_x_AllModulos_AllPerfiles);
                        super.ps_enca.setString(1, v.getEstado_A_I(rol.get(i).getEstado_filtro_pr()));
                        super.ps_enca.setInt(2, rol.get(i).getCodigo_taf());
                    } else {
                        /*UPDATE 1 PERFIL*/
                        super.setEncaPreparedStatement(SQLRol.Perfil.updatePerfilRoles_x_AllModulos_x_Perfil);
                        super.ps_enca.setString(1, v.getEstado_A_I(rol.get(i).getEstado_filtro_pr()));
                        super.ps_enca.setInt(2, rol.get(i).getCodigo_taf());
                        super.ps_enca.setInt(3, pr.getCodigo_tp());
                    }
                } else {
                    /*UPDATE POR MODULO*/
                    if (pr.getEstado_all_perfiles_pr() == true) {
                        /*UPDATE ALL PERFILES*/
                        super.setEncaPreparedStatement(SQLRol.Perfil.updatePerfilRoles_x_Modulo_x_AllPerfil);
                        super.ps_enca.setString(1, v.getEstado_A_I(rol.get(i).getEstado_filtro_pr()));
                        super.ps_enca.setInt(2, rol.get(i).getCodigo_taf());
                        super.ps_enca.setInt(3, pr.getCodigo_m());
                    } else {
                        /*UPDATE 1 PERFIL*/
                        super.setEncaPreparedStatement(SQLRol.Perfil.updatePerfilRoles_x_Modulo_x_Perfil);
                        super.ps_enca.setString(1, v.getEstado_A_I(rol.get(i).getEstado_filtro_pr()));
                        super.ps_enca.setInt(2, rol.get(i).getCodigo_taf());
                        super.ps_enca.setInt(3, pr.getCodigo_tp());
                        super.ps_enca.setInt(4, pr.getCodigo_m());
                    }
                }
                super.ps_enca.executeUpdate();
            }
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }

    public void updateRolesUsuario(List<PerfilRoles> lista) throws Exception {
        try {

            for (int i = 0; i < lista.size(); i++) {

                List<Rol> rol = lista.get(i).getRol();
                for (int j = 0; j < rol.size(); j++) {
                    super.setEncaPreparedStatement(SQLRol.Usuario.update);
                    super.ps_enca.setString(1, v.getEstado_A_I(rol.get(j).getEstado_filtro_pr()));
                    super.ps_enca.setInt(2, rol.get(j).getCodigo_taf());
                    super.ps_enca.setInt(3, lista.get(i).getCodigo_f());
                    super.ps_enca.setInt(4, lista.get(0).getCodigo_u());
                    super.ps_enca.executeUpdate();
                }
            }
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }

    public List<PerfilRoles> getPerfilRoles_x_TipoPerfil(Integer codigo_tp) throws Exception {
        List<PerfilRoles> lista = new ArrayList<PerfilRoles>();
        try {
            super.setEncaPreparedStatement(SQLRol.Perfil.getPerfilRoles_x_TipoPerfil);
            super.ps_enca.setInt(1, codigo_tp);
            super.rs_enca = ps_enca.executeQuery();

            while (super.rs_enca.next()) {
                lista.add(this.getPerfilRoles(rs_enca));
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }

    private PerfilRoles getPerfilRoles(ResultSet rs) throws Exception {
        try {
            PerfilRoles pr = new PerfilRoles();
            /*FORMULARIO*/
            pr.setCodigo_f(rs.getInt("codigo_f"));
            pr.setNombre_f(rs.getString("nombre_f"));

            /*MODULO*/
            pr.setCodigo_m(rs.getInt("codigo_m"));
            pr.setNombre_m(rs.getString("nombre_m"));

            /*TIPO PERFIL*/
            pr.setCodigo_tp(rs.getInt("codigo_tp"));
            pr.setNombre_tp(rs.getString("nombre_tp"));

            /*ROL*/
            pr.setRol(this.getRol(rs.getInt("codigo_tp"), rs.getInt("codigo_f")));/*OBTIENE TIPO_ACCION_FORMULARIO X LISTA*/
            return pr;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private List<Rol> getRol(Integer codigo_tp, Integer codigo_f) throws Exception {
        List<Rol> lista = new ArrayList<Rol>();
        try {
            super.setDetaPreparedStatement(SQLRol.Perfil.getRol_x_TipoPerfil_x_Formulario);
            super.ps_deta.setInt(1, codigo_tp);
            super.ps_deta.setInt(2, codigo_f);
            super.rs_deta = ps_deta.executeQuery();
            while (super.rs_deta.next()) {
                lista.add(this.getRol(rs_deta));
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private Rol getRol(ResultSet rs) throws Exception {
        try {
            Rol pr = new Rol();
            pr.setCodigo_pr(rs.getInt("codigo_pr"));
            pr.setEstado_pr(rs.getString("estado_pr"));
            pr.setEstado_filtro_pr(v.getEstado_A_I(rs.getString("estado_pr")));
            pr.setNombre_taf(rs.getString("nombre_taf"));
            pr.setCodigo_taf(rs.getInt("codigo_taf"));
            return pr;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Rol> getRolInicio() throws Exception {
        /*INICIALIZAR VALORES DE ROL*/
        List<Rol> lista = new ArrayList<Rol>();
        try {
            super.getEncaExecuteQuery(SQLTipoAccionFormulario.getTipoAccionFormularioActivos);
            while (super.rs_enca.next()) {
                lista.add(this.getRolInicio(super.rs_enca));
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }

    private Rol getRolInicio(ResultSet rs) throws Exception {
        try {
            Rol pr = new Rol();
            pr.setEstado_filtro_pr(false);
            pr.setNombre_taf(rs.getString("nombre_taf"));
            pr.setCodigo_taf(rs.getInt("codigo_taf"));
            return pr;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<TipoPerfil> getPerfilesActivos() throws Exception {
        try {
            TipoPerfilControlador tp = new TipoPerfilControlador();
            return tp.getTipoPerfilesActivos();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
